package trocabi.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.ArrayList;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import trocabi.TROCABI;
import trocabi.Renderer.BoldCellRenderer;
import trocabi.Renderer.DefaultCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import trocabi.DAO.DAODepositaire;
import trocabi.Socle.JStringTextField;
import trocabi.Socle.SwingTools;
import trocabi.Socle.TechnicalException;
import trocabi.model.Depositaire;
import trocabi.service.DepositaireServices;

/* Fenetre à double-utilisation :
 *      - pour rechercher/créer un dépositaire lors d'un dépôt
 *      - pour rechercher un dépositaire lors d'une facturation
 * --> créer une méthode setFacturationUse(boolean use) qui met les paramètres en état "facturation" ou en état "dépôt"
 */
public class GuiDepositaires extends JFrame implements ListSelectionListener {
    private static final Logger            logger = Logger.getLogger("trocabi.view.GuiDepositaires");
    private JTableModelDepositaires        depositairesModele;
    private DepositaireServices            depositaireServices;
    private GuiSaisieDepositaire           guiSaisieDepositaire;
    private GuiFacturation                 guiFacturation;
    private JTable                         viewDepositaires;
    private JStringTextField               fieldNom=new JStringTextField(DAODepositaire.FD_NOM_SIZE,true);
    private JStringTextField               fieldPrenom=new JStringTextField(DAODepositaire.FD_PRENOM_SIZE,false);
    private JButton                        btRecherche;
    private JButton                        jbNouveau;
    private JButton                        btValider;
    // Déclaration variables
    private JPanel                         pContentPanel;
    private JPanel                         pCenter;
    private JPanel                         pRecherche;
    private JScrollPane                    spListe;
    private JPanel                         pBoutons;
    private boolean                        bFacturation;

    public GuiDepositaires() {
        initComponents();
        depositaireServices=new DepositaireServices();
    }
    
    public void setGuiSaisieDepositaire(GuiSaisieDepositaire guiSaisieDepositaire) {
        this.guiSaisieDepositaire=guiSaisieDepositaire;
    }
    public void setGuiFacturation(GuiFacturation guiFacturation) {
        this.guiFacturation=guiFacturation;
    }
    
    private void initComponents() {
        this.setTitle("Rechercher/créer un dépositaire");
        this.setSize(868, 600);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        /*
        this.addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                JFrame me=(JFrame) e.getSource();
                Dimension size=me.getSize();
                // This is only called when the user releases the mouse button.
                System.out.println(String.format("h=%d w=%d",size.height,size.width));
            }
        });
        * */
        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

        // Content panel de type BorderPanel --> nord = titre / centre = contenu / sud = licence, droits, auteurs ...
        pContentPanel = new JPanel(new BorderLayout());
        pContentPanel.setBackground(Color.white);
        this.setContentPane(pContentPanel);
        /*
         * Que du gridBagLayout
         * Panel de 3 lignes --> toutes les lignes contiennent des panels (ligne 2 = scrollpanel / les autres = GridBagLayout)
         */
        pCenter = new JPanel(new GridBagLayout());
        GridBagConstraints grid = new GridBagConstraints();
        // Sous-panel "Rechercher Dépositaire"
        pRecherche = new JPanel(new GridBagLayout());
        grid.gridx = 0;
        grid.gridy = 0;
        grid.anchor = GridBagConstraints.LINE_START;
        grid.insets = new Insets(10, 10, 0, 10);
        pRecherche.add(new JLabel("Nom :"), grid);
        grid.gridy = 1;
        pRecherche.add(new JLabel("Prénom :"), grid);

        fieldPrenom.setPreferredSize(new Dimension(150, 20));
        grid.gridx = 1;
        pRecherche.add(fieldPrenom, grid);

        fieldNom.setPreferredSize(new Dimension(150, 20));
        grid.gridy = 0;
        pRecherche.add(fieldNom, grid);
        btRecherche = new JButton("Recherche");
        btRecherche.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                chercherDepositaire();
            }
        });
        grid.gridx = 3;
        grid.gridy = 3;
        grid.weightx = 1;
        grid.weighty = 1;
        grid.insets = new Insets(0, 10, 10, 10);
        grid.anchor = GridBagConstraints.LINE_END;
        pRecherche.add(btRecherche, grid);
        grid.gridx = 0;
        grid.gridy = 0;
        grid.weighty = 0;
        grid.fill = GridBagConstraints.BOTH;
        pCenter.add(pRecherche, grid);
        // Sous-panel "Afficher Résultats Recherche"
        depositairesModele = new JTableModelDepositaires();
        viewDepositaires = new JTable(depositairesModele);
        int[] colSize = { 100, 100, 110, 300, 100, 100 };
        SwingTools.setJTableSize(viewDepositaires, colSize);
        viewDepositaires.setDefaultRenderer(Object.class, new DefaultCellRenderer());
        viewDepositaires.getColumnModel().getColumn(0).setCellRenderer(new BoldCellRenderer());
        viewDepositaires.getSelectionModel().addListSelectionListener(this);
        viewDepositaires.setRowSorter(null); // disable row sorter
        spListe = new JScrollPane(viewDepositaires);
        grid.gridx = 0;
        grid.gridy = 1;
        grid.weightx = 0;
        grid.weighty = 1;
        pCenter.add(spListe, grid);
        // Sous-panel "Boutons"
        pBoutons = new JPanel(new GridBagLayout());
        jbNouveau = new JButton("Nouveau Dépositaire");
        jbNouveau.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                guiSaisieDepositaire.clear();
                guiSaisieDepositaire.setVisible(true);
            }
        });
        grid.gridx = 0;
        grid.gridy = 0;
        grid.weighty = 0;
        grid.fill = GridBagConstraints.NONE;
        grid.anchor = GridBagConstraints.LINE_START;
        pBoutons.add(jbNouveau, grid);
        btValider = new JButton("Valider");
        btValider.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Depositaire depositaire=depositairesModele.getDepositaireAt(viewDepositaires.getSelectedRow());
                if (bFacturation) {
                    guiFacturation.setDepositaire(depositaire);
                    guiFacturation.setVisible(true);
                } else {
                    guiSaisieDepositaire.setDepositaire(depositaire);
                    guiSaisieDepositaire.setVisible(true);
                }
            }
        });
        grid.gridx = 1;
        grid.weightx = 1;
        grid.anchor = GridBagConstraints.LINE_END;
        pBoutons.add(btValider, grid);
        grid.gridx = 0;
        grid.gridy = 2;
        grid.fill = GridBagConstraints.HORIZONTAL;
        pCenter.add(pBoutons, grid);
        pContentPanel.add(pCenter, BorderLayout.CENTER);
    }

    public void setFacturation(boolean bFacturation_tmp) {
        GridBagConstraints tmp = new GridBagConstraints();
        bFacturation = bFacturation_tmp;
        if (bFacturation) {
            this.setTitle("Facturation - Rechercher/créer un dépositaire");
            pBoutons.remove(jbNouveau);
            pBoutons.remove(btValider);
            tmp.gridx = 0;
            tmp.gridy = 0;
            tmp.weightx = 1;
            tmp.anchor = GridBagConstraints.LINE_END;
            pBoutons.add(btValider, tmp);
        } else {
            this.setTitle("Dépôt - Rechercher/créer un dépositaire");
            pBoutons.remove(jbNouveau);
            pBoutons.remove(btValider);
            tmp.gridx = 0;
            tmp.gridy = 0;
            tmp.anchor = GridBagConstraints.LINE_START;
            pBoutons.add(jbNouveau, tmp);
            tmp.gridx = 1;
            tmp.weightx = 1;
            tmp.anchor = GridBagConstraints.LINE_END;
            pBoutons.add(btValider, tmp);
        }
    }

    public void setDefault() {
        this.setLocationRelativeTo(null);
        fieldNom.setText("");
        fieldPrenom.setText("");
        btValider.setEnabled(false);
        depositairesModele.removeAll();
    }

    @Override
    public void valueChanged(ListSelectionEvent lse) {
        if (lse.getSource() == viewDepositaires.getSelectionModel()) {
            if (viewDepositaires.getSelectedRowCount() == 1) {
                btValider.setEnabled(true);
            } else {
                btValider.setEnabled(false);
            }
        } else {
            TROCABI.fenetreExterne(TROCABI.ERREUR, "Erreur inattendue : source de l'évènement inconnue");
        }
    }
    
    public void chercherDepositaire() {
        if (fieldNom.getText().isEmpty() && fieldPrenom.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "Vous devez saisir un nom ou un prénom pour faire une recherche");
            return;
        }
        try {
            ArrayList<Depositaire> listDepositaires = depositaireServices.searchDepositaireByName(fieldNom.getText(), fieldPrenom.getText());
            if (listDepositaires.isEmpty()) {
                JOptionPane.showMessageDialog(null, "Aucun dépositaire trouvé.");
            }
            depositairesModele.add(listDepositaires);
        } catch (TechnicalException e) {
            TROCABI.fenetreExterne(TROCABI.ERREUR, e.getMessage());
        }
    }
}
